package com.swotxu.mall.product;

import com.swotxu.common.conf.anno.EnableMallRedisHttpSession;
import com.swotxu.common.conf.anno.EnableMallSeata;
import com.swotxu.common.conf.anno.EnableMallThreadPoolExecutor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1、整合 MyBatis-Plus
 *   1）导入依赖
 *   <dependency>
 * 	    <groupId>com.baomidou</groupId>
 * 	    <artifactId>mybatis-plus-boot-starter</artifactId>
 * 	    <version>3.2.0</version>
 *   </dependency>
 *   2）配置
 *      a、配置数据库（导入数据库驱动，在 application.yml 中配置数据源信息）
 *      b、配置 MyBatis-Plus
 *          1）使用 @MapperScan
 *          2）配置 sql 映射文件位置
 * 2、逻辑删除 （https://baomidou.com/guide/logic-delete.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95）
 *   1）配置全局逻辑删除（高版本省略）
 *   2）配置逻辑删除的组件Bean（高版本省略）
 *   3）给实体类逻辑删除属性加上@TableLogic注解
 *
 * 3、后端校验 JSR303
 *   1）给Bean添加校验注解: javax.validation.constraints
 *   2）在相应controller标注 @Valid 以启用规则校验
 *   3）在校验的参数后面，紧跟一个 BindingResult 参数，用于获取校验结果
 *   4）分组校验
 *       a、@Null(message = "新增不能指定ID", groups = {AddGroup.class})
 *       b、@Validated({AddGroup.class})
 *       c、默认没有指定分组的校验注解在分组情况下不生效
 *   5）自定义校验注解
 *       a、编写自定义注解
 *       b、编写自定义校验器
 *       c、关联自定义校验器和自定义注解
 *
 * 4、统一异常处理
 *   1）编写异常处理类，使用 @ControllerAdvice
 *   2）使用 @ExceptionHandler 标注处理方法
 *
 * 5、模板引擎
 *   1）thymeleaf-starter：关闭缓存
 *   2）静态资源放在static文件夹下可直接访问，页面放在templates下可直接访问
 *      Springboot 访问项目自动找index.html
 *   3）页面修改不重启服务器实时更新
 *      a、引入dev-tools
 *      b、修改完页面后 ctrl+F9 刷新
 *
 *  6、整合redis
 *   1）引入 spring-boot-starter-data-redis
 *   2）简单配置redis的host等信息
 *   3）使用SpringBoot自动配置好的 StringRedisTemplate操作Redis
 *
 *  7、整合redisson分布式锁框架
 *  文档：https://github.com/redisson/redisson/wiki/Table-of-Content
 *   1）引入 redisson依赖
 *   2）注入 RedissonClient 实例
 *
 *  8、整合spring cache简化缓存开发
 *   1）引入 spring-boot-starter-cache、spring-boot-starter-data-redis依赖
 *   2）写配置
 *      a、自动配置哪些
 *          CacheAutoConfiguration 会导入 RedisCacheConfiguration
 *          RedisCacheConfiguration 会自动导入 RedisCacheManager
 *      b、我们手动配置哪些
 *          配置使用redis作为缓存 spring.cache.type=redis
 *   3）测试使用缓存
 *      @Cacheable：触发将数据保存到缓存的操作
 *      @CacheEvict：触发将数据从缓存删除的操作
 *      @CachePut：不影响方法执行的更新缓存
 *      @Caching：组合以上多个操作
 *      @CacheConfig：在类级共享缓存的相同配置
 *      a、开启缓存 @EnableCaching
 *      b、只需要使用注解就能完成缓存操作
 *
 */
@SpringBootApplication
@EnableDiscoveryClient
//@EnableRedisHttpSession
@EnableMallRedisHttpSession // 使用自定义注解整合 RedisSession
@EnableMallThreadPoolExecutor // 使用自定义注解整合 ThreadPool
@EnableMallSeata
@EnableFeignClients(basePackages = "com.swotxu.mall.product.feign")
public class MallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(MallProductApplication.class, args);
    }

}
